<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="https://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
<head><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8">
  <title>7.13. 配置网络脚本</title>
  <link rel="stylesheet" href="../stylesheets/lfs.css" type="text/css">
  <link rel="stylesheet" href="../stylesheets/lfs-print.css"
 type="text/css" media="print">
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head>
<body id="lfs" class="6.2">
<div class="navheader">
<div class="headertitles">
<h4>Linux From Scratch - 版本 6.2</h4>
<h3>第七章 配置系统启动脚本</h3>
</div>
<ul class="headerlinks">
  <li class="prev"> <a accesskey="p" href="symlinks.html"
 title="为设备创建惯用符号连接">后退</a>
    <p>为设备创建惯用符号连接</p>
  </li>
  <li class="next"> <a accesskey="n" href="../chapter08/chapter08.html"
 title="使 LFS 系统能够启动">前进</a>
    <p>使 LFS 系统能够启动</p>
  </li>
  <li class="up"><a accesskey="u" href="chapter07.html"
 title="第七章 配置系统启动脚本">上一级</a></li>
  <li class="home"><a accesskey="h" href="../index.html"
 title="Linux From Scratch - 版本 6.2">首页</a></li>
</ul>
</div>
<div class="sect1">
<div class="titlepage">
<h1 class="sect1">7.13. 配置网络脚本</h1>
</div>
<p> 本节仅适用于需要配置网卡的情况。 </p>
<p> 如果不使用网卡，就不需要创建关联网卡的配置文件，这样的话，在所有运行级目录(<tt class="filename">/etc/rc.d/rc*.d</tt>)
下删除 <tt class="filename">network</tt> 符号链接。 </p>
<div class="sect2">
<div class="titlepage">
<h2 class="sect2">7.13.1. 创建网络接口的稳定名称</h2>
</div>
<p>这一段的说明对于单网卡是可选的。</p>
<p>由于 Udev 和
网络驱动的模块化，网络设备的接口的加载顺序在每次reboot后可能会不同，因为驱动是并行加载的，所以顺序会变成随机。例如，在一台计算机上有两块网
卡Intel 和 Realtek。Intel 制造的网卡可能是 eth0，Realtelk 的网卡是
eth1;但是重启后网卡的顺序可能反过来。为避免这种情况，我们应该
根据网卡的MAC地址或总线位置来为他们命名。</p>
<p>如果想要根据MAC地址来识别网卡，可以使用如下命令：</p>
<pre class="userinput"><kbd class="command">grep -H . /sys/class/net/*/address</kbd></pre>
<p>为每个网卡（除loopback），设计一个描述性的名字，比方 “<span class="quote">realtek</span>”,
然后参照如下建立Udev规则：</p>
<pre class="userinput"><kbd class="command">cat &gt; /etc/udev/rules.d/26-network.rules &lt;&lt; EOF<br><tt
 class="literal">ACTION=="add", SUBSYSTEM=="net", SYSFS{address}=="<em
 class="replaceable"><tt>00:e0:4c:12:34:56</tt></em>", \<br>    NAME="<em
 class="replaceable"><tt>realtek</tt></em>"<br>ACTION=="add", SUBSYSTEM=="net", SYSFS{address}=="<em
 class="replaceable"><tt>00:a0:c9:78:9a:bc</tt></em>", \<br>    NAME="<em
 class="replaceable"><tt>intel</tt></em>"</tt>
EOF</kbd></pre>
<div class="note">
<div class="admonhead"> <img alt="[Note]" src="../images/note.png">
<h3 class="admontitle">注意</h3>
</div>
<div class="admonbody">
<p>虽然这个例子可以正常工作，但要注意 <span class="application">udev</span>
不能识别 \ 的继续上一行的功能。所以如果用文本编辑器来编辑就一定要保证每个规则占一行。</p>
</div>
</div>
<p>如果要以总线位置作为标准，可以创建如下的Udev规则：</p>
<pre class="userinput"><kbd class="command">cat &gt; /etc/udev/rules.d/26-network.rules &lt;&lt; EOF<br><tt
 class="literal">ACTION=="add", SUBSYSTEM=="net", BUS=="<em
 class="replaceable"><tt>pci</tt></em>", ID=="<em class="replaceable"><tt>0000:00:0c.0</tt></em>", \<br>    NAME="<em
 class="replaceable"><tt>realtek</tt></em>"<br>ACTION=="add", SUBSYSTEM=="net", BUS=="<em
 class="replaceable"><tt>pci</tt></em>", ID=="<em class="replaceable"><tt>0000:00:0d.0</tt></em>", \<br>    NAME="<em
 class="replaceable"><tt>intel</tt></em>"</tt>
EOF</kbd></pre>
<p>这个规则会把网卡名字每次都定为 “<span class="quote">realtek</span>” 和 “<span
 class="quote">intel</span>”, 以替代eth0和eth1 （即：原来的eth0和eth1接口不存在了
除非把他们加到 NAME 下）。在下面的文件中我们使用描述性的名字来替代eth0 等。 </p>
<p> 需注明以上规则并不永远适用。例如, 当VLAN 和 网桥 使用时，以MAC为基准的命名就会出问题。由于 VLAN 和 网桥
在网卡上有相同的MAC地址。
如果只想重新命名网卡接口，而不是brige和VLAN接口，但是规则都会匹配它们。如果使用虚拟接口，我们会有两种解决办法。其一是把
DRIVER=="?*"
关键字加在 SUBSYSTEM=="net" 后。但这种方法对于一些老型号的网卡不起作用，因为这些网卡的 uevent 中没有 DRIVER
变量，因此
按规则就不可能匹配到这些卡。 另外一种就是以总线位置命名。 </p>
<p> 另外一种已知的不能工作的情况存在于无线网络中，当应用MadWifi 或 HostAP 驱动时,
他们会以相同的MAC地址和总线位置创建至少两个接口。例如，Madwifi 驱动会创建一个 athX 和 wifiX 接口（X是一个数字）。为区别
这些接口，可以把 KERNEL 参数，比如 KERNEL=="ath*" 加到
SUBSYSTEM=="net"后。 </p>
<p> 可能还有很多情况会导致不能正常工作，现在这方面的 bug 仍然不断的报告给 Linux
的各个发布版，没有一个解决方法可以解决所有的情况。</p>
</div>
<div class="sect2">
<div class="titlepage">
<h2 class="sect2">7.13.2. 创建网络接口配置文件</h2>
</div>
<p>network 脚本启用或关闭哪个接口由 <tt class="filename">/etc/sysconfig/network-devices</tt>
目录下的文件决定，这个目录下的文件应该是类似于 <tt class="filename">ifconfig.xyz</tt> 的形式，这里"<span
 class="quote">xyz</span>"是网络接口名(例如 eth0 或者
eth0:1)。这个目录中的文件将定义接口的属性，比如IP地址、子网掩码等等。 </p>
<p>在这个目录下新建文件，下面是一个为 <span class="emphasis"><em>eth0</em></span> 设备创建 <tt
 class="filename">ipv4</tt> 文件的示例：</p>
<pre class="userinput"><kbd class="command">cd /etc/sysconfig/network-devices &amp;&amp;<br>mkdir -v ifconfig.eth0 &amp;&amp;<br>cat &gt; ifconfig.eth0/ipv4 &lt;&lt; "EOF"<br><tt
 class="literal">ONBOOT=yes<br>SERVICE=ipv4-static<br>IP=192.168.1.1<br>GATEWAY=192.168.1.2<br>PREFIX=24<br>BROADCAST=192.168.1.255</tt>
EOF</kbd></pre>
<p>每个文件中的这些变量的值都要改成您的设置，如果 <tt class="envar">ONBOOT</tt> 变量设置为"<span
 class="quote">yes</span>"，network 脚本会在系统启动的时候启动 NIC(Network Interface
Card 网络接口卡，简称网卡)，如果设置为"<span class="quote">yes</span>"以外的值，网卡会被 network
脚本忽略而没有启动。 </p>
<p><tt class="envar">SERVICE</tt> 变量定义获取 IP 地址的方式，LFS-Bootscripts
有一套模块化的 IP 地址分配格式，并在 <tt class="filename">/etc/sysconfig/network-devices/services</tt>
目录下为其它的 IP 分配方式创建了附加的文件，这通常用作 DHCP(Dynamic Host Configuration Protocol
动态主机配置协议)方式，在 BLFS 里有详细介绍。 </p>
<p><tt class="envar">GATEWAY</tt> 变量应该设置为默认网关的 IP
地址，如果没有默认网关，就把这个变量完全注释掉。 </p>
<p><tt class="envar">PREFIX</tt> 变量设置为子网使用的位数，IP 地址的每个字节是 8 bit
，如果子网掩码是 255.255.255.0 ，那么它使用前三个字节(24 bit)指定网络号；如果网络掩码是 255.255.255.240
，它用前 28 bit 来指定网络号。长于 24 bit 的前缀一般由 DSL 和 cable 的 ISP(Internet Service
Providers 因特网服务提供商)使用，我们的例子里(PREFIX=24)，子网掩码是 255.255.255.0
，请根据您的网络情况调整 <tt class="envar">PREFIX</tt> 变量。 </p>
</div>
<div class="sect2">
<div class="titlepage"> <a id="resolv.conf" name="resolv.conf"></a>
<h2 class="sect2">7.13.3. 创建 /etc/resolv.conf 文件</h2>
</div>
<p>如果系统要连接到 Internet 上，就需要 DNS(Domain Name Service 域名服务)名称解析的手段，来把
Internet 域名解析为 IP 地址，反之亦然。在 <tt class="filename">/etc/resolv.conf</tt>
文件里设置 ISP 或网络管理员提供的域名服务器的 IP 地址就可以达到这个目的了，运行下面的命令创建这个文件：</p>
<pre class="userinput"><kbd class="command">cat &gt; /etc/resolv.conf &lt;&lt; "EOF"<br><tt
 class="literal"># Begin /etc/resolv.conf<br><br>domain {<em
 class="replaceable"><tt>&lt;域名&gt;</tt></em>}<br>nameserver <em
 class="replaceable"><tt>&lt;主域名服务器IP地址&gt;</tt></em>
nameserver <em
 class="replaceable"><tt>&lt;副域名服务器IP地址&gt;</tt></em>

# End /etc/resolv.conf</tt>
EOF</kbd></pre>
<p>把 <em class="replaceable"><tt>[域名服务器IP地址]</tt></em> 替换为您的域名服务器的 IP
地址。域名服务器常常不止一项(作为备份用途)，如果您只需要一个域名服务器，把文件里的第二行 <span class="emphasis"><em>nameserver</em></span>
删除就可以了。在局域网里这个 IP 地址还可能是路由器。 </p>
</div>
</div>
<div class="navfooter">
<ul>
  <li class="prev"> <a accesskey="p" href="symlinks.html"
 title="为设备创建惯用符号连接">后退</a>
    <p>为设备创建惯用符号连接</p>
  </li>
  <li class="next"> <a accesskey="n" href="../chapter08/chapter08.html"
 title="使 LFS 系统能够启动">前进</a>
    <p>使 LFS 系统能够启动</p>
  </li>
  <li class="up"><a accesskey="u" href="chapter07.html"
 title="第七章 配置系统启动脚本">上一级</a></li>
  <li class="home"><a accesskey="h" href="../index.html"
 title="Linux From Scratch - 版本 6.2">首页</a>. </li>
</ul>
</div>
</body></html>
